package clases

import org.scalatest.junit.AssertionsForJUnit
import scala.collection.mutable.ListBuffer
import org.junit.Assert._
import org.junit.Test
import org.junit.Before
import mixins._
import excepciones._

class testCancha extends AssertionsForJUnit  {
  var reservaA: Reserva = _
  var reservaB: Reserva = _
  var reservaC: Reserva = _
  var reservaD: Reserva = _
  var cancha: Cancha = _
  var canchaConLuces: Cancha = _
  var canchaConTribunaParaFutbol: Cancha = _
  var canchaConTecho: Cancha = _
  var canchaTipoTennis: Cancha = _
  var canchaTipoPaddle: Cancha = _
  var canchaTipoFutbol: Cancha = _
  var canchaConTodo: Cancha = _

  @Before def initialize() {
    reservaA = new Reserva(1, 16, 17, new Cliente)
    reservaB = new Reserva(1, 17, 18, new Cliente)
    reservaC = new Reserva(1, 18, 19, new Cliente)
    reservaD = new Reserva(1, 16, 18, new Cliente)
    cancha = new Cancha()
    cancha.numero = 1
//    cancha.horaMinimaDeJuego = 9
//    cancha.horaMaximaDeJuego = 18
    canchaConLuces = new Cancha with TipoTenis with ConLuces
    canchaConTribunaParaFutbol = new Cancha with TipoFutbol with ConTribuna { jugadores = 10 }
    canchaConTecho = new Cancha with ConTecho
    canchaTipoTennis = new Cancha with TipoTenis
    canchaTipoPaddle = new Cancha with TipoPaddle with ConTecho
    canchaTipoFutbol = new Cancha with TipoFutbol with ConTribuna { jugadores = 10 }
    
    canchaConTodo = new Cancha with TipoTenis with ConTribuna with ConLuces with ConTecho
  }
  @Test def reservarUnaCancha() {
    assertTrue(cancha.sePuedeReservar(reservaA))
    var x = cancha.reservas.size
    cancha.reservatePara(reservaA)
    assertTrue(cancha.reservas.size == (x + 1))
    assertTrue(cancha.sePuedeReservar(reservaB))
    x = cancha.reservas.size
    cancha.reservatePara(reservaB)
    assertTrue(cancha.reservas.size == (x + 1))
    assertFalse(cancha.sePuedeReservar(reservaC))
    try {
      cancha.reservatePara(reservaC)
    } catch {
      case e: NoReservableExcepcion => // Expected

    }
  }

  @Test def unaCanchadeTennisConLuces() {
    assertTrue(canchaConLuces.sePuedeReservar(reservaC))
    /* precio del 100%, osea 150 para una cancha de tenis, si nuestros clientes comienzan con saldo de 200 base se quedan con 50 */
    var x = canchaConLuces.reservas.size

    canchaConLuces.reservatePara(reservaA)

    assertTrue(reservaA.cliente.monedero == 50)
    /* precio del 120% por ser de noche, osea 180 para una cancha de tenis, si nuestros clientes comienzan con saldo de 200 base se quedan con 20 */
    canchaConLuces.reservatePara(reservaC)
    assertTrue(reservaC.cliente.monedero == 20)
  }

  @Test
  def unaCanchadeFutbolTribuna(){
    //si no borre esto es porque sigue parametrizado por codigo(aka hardcodeado) el que nunca es un fin de semana, esta en los planes usar jodatime asi que 
    //no vale la pena crear un sistema para mockear eso
    /*como esta definido en el bedore, la cancha es de futbol 5*/

    //assertTrue(canchaConTribunaParaFutbol.sePuedeReservar(reservaA))
    //esto tira exepcion
      intercept[SinSaldoException]{
       canchaConTribunaParaFutbol.reservatePara(reservaA)
      }
      //porque es finde sale el doble -800
    reservaA.cliente.aumentar(600) 
    canchaConTribunaParaFutbol.reservatePara(reservaA)
    assertTrue(reservaA.cliente.monedero == 0)
  }
  
   @Test 
  def unaCanchadePaddleConTecho(){
      canchaTipoPaddle.reservatePara(reservaA)
      //no somos quienes para controlar la lluvia
      assertTrue(reservaA.cliente.monedero == 100 || reservaA.cliente.monedero == 90 )
      //la mejor forma de testear que el metodo funciona, es remover uno de las dos condiciones del or y ejecutar repetidamente el
      //el test, dado que asi puede verse como, at random, falla el assert
   }
  
  
    
//    @Test def unaCanchaConTodo() {
//    canchaConTodo.reservatePara(reservaC)       
//    println(reservaC.cliente.monedero);        
//    assertTrue(reservaC.cliente.monedero == 1604)
//    
//    }
 

}